package cn.yh.nft.turbo.user.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.yh.nft.turbo.api.user.response.data.InviteRankInfo;
import cn.yh.nft.turbo.api.user.response.data.UserInfo;
import cn.yh.nft.turbo.base.response.PageResponse;
import cn.yh.nft.turbo.user.domain.entity.User;
import cn.yh.nft.turbo.user.domain.entity.convertor.UserConvertor;
import cn.yh.nft.turbo.user.domain.service.impl.UserService;
import cn.yh.nft.turbo.web.vo.MultiResult;
import cn.yh.nft.turbo.web.vo.Result;
import groovy.util.logging.Slf4j;
import jakarta.validation.constraints.Max;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @ClassName: InviteController
 * @Author: 草莓爱上啵啵
 *
 *  邀请
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("user/invite")
public class InviteController {

    @Autowired
    private UserService userService;

    /**
     * 获取邀请排行榜前N名用户信息
     * 此方法用于响应GET请求，并返回邀请排行榜前N名用户的详细信息
     * 如果请求参数中的topN未提供或超出范围，则默认获取前100名用户的信息
     *
     * @param topN 排行榜的排名数量，不能超过100如果未提供，则默认为100
     * @return 返回一个MultiResult对象，其中包含邀请排行榜前N名用户的详细信息
     */
    @GetMapping("/getTopN")
    public MultiResult<InviteRankInfo> getTopN(@Max(100) Integer topN){
        // 如果topN参数为空，则默认设置为100
        if (topN == null){
            topN = 100;
        }

        // 调用userService的getTopN方法获取排名前N的邀请信息
        List<InviteRankInfo> inviteRankInfos = userService.getTopN(topN);
        // 返回一个成功的MultiResult对象，包含邀请信息列表、查询的排名范围和分页信息
        return MultiResult.successMulti(inviteRankInfos, topN, 1, 10);
    }

    @GetMapping("/getMyRank")
    public Result<Integer> getMyRank(){
        String userId = (String) StpUtil.getLoginId();
        Integer rank = userService.getInviteRank(userId);
        return Result.success(rank);
    }

    @GetMapping("/getInviteList")
    public MultiResult<UserInfo> getInviteList(int currentPage){
        String userId = (String) StpUtil.getLoginId();

        PageResponse<User> pageResponse = userService.getUsersByInviterId(userId, currentPage, 20);

        return MultiResult.successMulti(UserConvertor.INSTANCE.mapToVo(pageResponse.getDatas()), pageResponse.getTotal(), currentPage, 20);
    }

}
